package com.clp.inflxudb.core.flux_function;

import com.clp.inflxudb.core.Flux;
import com.clp.inflxudb.core.enums.FluxKey;
import com.clp.inflxudb.core.enums.GroupMode;

import java.util.Arrays;

/**
 * 实现时间排序和分页的 FluxFunction
 */
public class SortPageFluxFunction implements FluxFunction {
    private boolean desc = true; // 是否降序
    private int pageIdx = 1; // 页号，从1开始
    private int pageSize = 0; // 页面大小

    /**
     * @param desc：是否按时间降序
     * @param pageIdx：页号（从0开始）
     * @param pageSize：页面大小
     */
    public SortPageFluxFunction(Boolean desc, Integer pageIdx, Integer pageSize) {
        if (desc != null) {
            this.desc = desc;
        }
        if (pageIdx != null) {
            this.pageIdx = pageIdx;
        }
        if (pageSize != null) {
            this.pageSize = pageSize;
        }
    }

    @Override
    public void doFunction(Flux flux) {
        // 按时间分组
        flux.group(Arrays.asList(FluxKey._measurement), GroupMode.by)
                .sort(Arrays.asList(FluxKey._time), desc)
                .limit((pageIdx - 1) * pageSize, pageSize);
    }
}
